﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows;
using System.Windows.Markup;

namespace WPF.Element.UI.CustomControls
{
    /* 基于内容控件的自定义控件  public class CustomControl : ContentControl
     {
         // 静态构造函数中注册依赖属性
         static CustomControl()
         {
             // 注册一个名为ExampleProperty的依赖属性
             // 默认值为"Default Value"
             // 使用FrameworkPropertyMetadataOptions.BindsTwoWayByDefault来设置双向绑定默认行为
             ExamplePropertyProperty = DependencyProperty.Register(
                 "ExampleProperty", typeof(string), typeof(CustomControl),
                 new FrameworkPropertyMetadata("Default Value", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
         }

         // 属性包装器
         public string ExampleProperty
         {
             get 
             { 
                 return (string)GetValue(ExamplePropertyProperty); 
             }
             set 
             { 
                 SetValue(ExamplePropertyProperty, value);
             }
         }

         // 公共静态只读字段，用于XAML中标识此属性
         public static readonly DependencyProperty ExamplePropertyProperty;
     }*/


    /// <summary>
    ///  这是 直接可以在元素中设置值 并直接转化要想把字符串转成别的类型  或者各个类型请看下面的教程
    ///  也可以在 AI Kimi 中搜索   wpf 自定义控件当在元素开始和结束之间设置值的时候怎么转换
    ///  kimi地址是：https://kimi.moonshot.cn/chat/cu4vim8u8ldafk1g9g10
    /// </summary>
#if false // 反编译日志
在WPF中，并不是只有内置控件才能在元素中间直接设置值。自定义控件也可以通过特定的方式实现这一功能。具体来说，可以通过以下两种方式实现：
1. 使用ContentProperty属性
通过在自定义控件上使用ContentProperty属性，可以指定一个属性作为内容属性。这样，就可以在元素中间直接设置该属性的值。
示例
假设有一个自定义控件MyCustomControl，它有一个属性MyContent，类型为string。可以通过ContentProperty属性指定MyContent为内容属性：
csharp复制
using System.Windows;
using System.Windows.Controls;

[ContentProperty("MyContent")]
public class MyCustomControl : Control
{
    public static readonly DependencyProperty MyContentProperty =
        DependencyProperty.Register(
            "MyContent",
            typeof(string),
            typeof(MyCustomControl),
            new PropertyMetadata(default(string)));

    public string MyContent
    {
        get => (string)GetValue(MyContentProperty);
        set => SetValue(MyContentProperty, value);
    }
}
在XAML中，可以这样使用：
xml复制
<local:MyCustomControl>
    这是内容
</local:MyCustomControl>
2. 使用TypeConverter和ContentProperty结合
如果自定义属性的类型不是string，而是自定义类型，可以通过结合TypeConverter和ContentProperty来实现。
示例
假设有一个自定义类型MyCustomType，并为其创建了一个TypeConverter：
csharp复制
[TypeConverter(typeof(MyCustomTypeConverter))]
public class MyCustomType
{
    public string Value { get; set; }

    public MyCustomType(string value)
    {
        Value = value;
    }

    public override string ToString()
    {
        return Value;
    }
}
创建TypeConverter：
csharp复制
using System;
using System.ComponentModel;
using System.Globalization;

public class MyCustomTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string)
        {
            string stringValue = (string)value;
            return new MyCustomType(stringValue);
        }
        return base.ConvertFrom(context, culture, value);
    }
}
在自定义控件上使用ContentProperty属性：
csharp复制
[ContentProperty("MyContent")]
public class MyCustomControl : Control
{
    public static readonly DependencyProperty MyContentProperty =
        DependencyProperty.Register(
            "MyContent",
            typeof(MyCustomType),
            typeof(MyCustomControl),
            new PropertyMetadata(default(MyCustomType)));

    public MyCustomType MyContent
    {
        get => (MyCustomType)GetValue(MyContentProperty);
        set => SetValue(MyContentProperty, value);
    }
}
在XAML中，可以这样使用：
xml复制
<local:MyCustomControl>
    这是内容
</local:MyCustomControl>
总结
通过使用ContentProperty属性，可以指定自定义控件的某个属性作为内容属性，从而在XAML中直接在元素中间设置该属性的值。如果该属性的类型是自定义类型，还可以结合TypeConverter来实现字符串到自定义类型的转换。这样，自定义控件也可以像内置控件一样在XAML中直接设置内容。
#endif

    [ContentProperty("MyContent")]
    public class CustomControl : Control
    {
        // 静态构造函数中注册依赖属性
        static CustomControl()
        {
            // 注册一个名为ExampleProperty的依赖属性
            // 默认值为"Default Value"
            // 使用FrameworkPropertyMetadataOptions.BindsTwoWayByDefault来设置双向绑定默认行为
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
        }
        public static readonly DependencyProperty MyContentProperty =
       DependencyProperty.Register(
           "MyContent",
           typeof(string),
           typeof(CustomControl),
           new PropertyMetadata(default(string)));

        public string MyContent
        {
            get => (string)GetValue(MyContentProperty);
            set => SetValue(MyContentProperty, value);
        }
      



    }




   

}
